#include "toast.h"

#include <QScreen>
#include <QHBoxLayout>
#include <QGraphicsDropShadowEffect>
#include <QLabel>
#include <QApplication>
#include <QTimer>
#include <QPainter>
#include <QStyleOption>
#include <QPropertyAnimation>

// 传入 nullptr 作为父对象，使其成为顶级窗口
Toast::Toast(const QString& text) : QDialog(nullptr) {
    // 1. 设置窗口基本参数
    this->setFixedSize(320, 60);
    this->setWindowTitle("消息通知"); // 窗口标题，用户通常看不到
    this->setWindowIcon(QIcon(":/resource/image/logo.png")); // 设置窗口图标
    this->setAttribute(Qt::WA_DeleteOnClose); // 窗口关闭时自动释放内存
    // 设置窗口标志：
    // Qt::FramelessWindowHint：无边框窗口
    // Qt::Tool：工具窗口类型，通常不在任务栏显示，且比普通窗口层级高一点
    // Qt::WindowStaysOnTopHint：窗口保持在最顶层（可选，根据需求决定是否需要）
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
    this->setAttribute(Qt::WA_TranslucentBackground);


    // 2. 窗口弹出位置
    QScreen* screen = QApplication::primaryScreen();
    int width = screen->size().width(), height = screen->size().height();
    int x = (width - this->width()) / 2, y = height - this->height() - 450;
    this->move(x, y);

    // 3. 添加中央容器和布局，并设置圆角和阴影
    QWidget* centralWidget = new QWidget(this); // 创建一个中央容器，用于承载实际内容和样式
    centralWidget->setObjectName("ToastCentralWidget");
    centralWidget->setStyleSheet(R"(
        #ToastCentralWidget {
            background-color: rgba(52, 52, 52, 200);
            border-radius: 8px;
        }
    )");

    // 阴影效果
    QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
    effect->setOffset(0, 5);
    effect->setColor(QColor(66, 66, 66, 80));
    effect->setBlurRadius(12);
    centralWidget->setGraphicsEffect(effect);

    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    mainLayout->setContentsMargins(0, 0, 0, 0); // 外边距设为0，确保 centralWidget 填充整个窗口
    mainLayout->addWidget(centralWidget);

    // 为 centralWidget 设置内部布局，用于放置文本内容
    QVBoxLayout* contentLayout = new QVBoxLayout(centralWidget);
    contentLayout->setSpacing(5);
    contentLayout->setContentsMargins(20, 15, 20, 15);

    // 4. 创建显示文本的 QLabel
    QLabel* label = new QLabel(text);
    label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    label->setAlignment(Qt::AlignCenter);
    label->setStyleSheet("QLabel { color: white; font-size: 14px; font-weight: normal; }");
    contentLayout->addWidget(label); // 将标签添加到内容布局中

    // 5. 实现 2s 之后自动关闭，并添加淡出动画
    QTimer* timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() {
        timer->stop(); // 停止计时器

        // 添加淡出动画
        QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
        animation->setDuration(300); // 动画持续时间300毫秒
        animation->setStartValue(1.0); // 从完全不透明开始
        animation->setEndValue(0.0); // 到完全透明结束
        animation->setEasingCurve(QEasingCurve::OutQuad); // 动画曲线，平滑过渡

        // 动画结束后关闭窗口并释放内存
        connect(animation, &QPropertyAnimation::finished, this, &Toast::close);
        animation->start(QPropertyAnimation::DeleteWhenStopped); // 动画停止时自动释放动画对象

        // 如果不添加淡出动画，直接关闭
        // this->close();
    });
    timer->start(1500); // 触发计时器
}


void Toast::showMessage(const QString &text){
    Toast* toast = new Toast(text);
    toast->show();
}
